/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package negocio;

import datos.EstadoObra;
import java.net.URL;
import java.util.List;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.NoResultException;
import javax.persistence.NonUniqueResultException;
import javax.persistence.PersistenceContext;
import org.apache.log4j.Logger;
import org.apache.log4j.PropertyConfigurator;

/**
 *
 * @author Ing. Monica Merlo, Ing. Agustin  Fernandez
 */
@Stateless
public class GestorEstadoObraBean implements GestorEstadoObraRemote, GestorEstadoObraLocal {

    /***
     *  Los objetos que invoca una aplicación para generar log se denominan \\\"loggers\\\" y son de la clase Logger.
     *  Una estrategia común y conveniente es que cada una de nuestras clases (al menos las que van a emitir log)
     *  tengan un objeto estático.
     *  Los niveles son los siguientes: debug, info, warn, error, fatal.
     */
    static Logger logger = Logger.getLogger(GestorEstadoObraBean.class);

    private static void log4jArchivo(Exception e) {

         /**
         * Primero obtenemos la url del archivo de configuración,
         * como están en el mismo paquete que la clase Main lo podemos obtener con el método getResource().
         */
        URL url = GestorEstadoObraBean.class.getResource("/configuracion/log4j.properties");
        /**
         * Despues cargamos el archivo de configuración
         */
        PropertyConfigurator.configure(url);
        logger.error(e);

    }

    @PersistenceContext
    private EntityManager em;

    /***
     * 
     * @param object
     */
    public void persist(Object object) {
        em.persist(object);
    }

    /***
     * Retorna una lista con todas las instancias de EstadoObra.
     * @return una lista con todos los posibles estados de obras almacenados en la Base de Datos,
     * y null en caso contrario
     * Interfaz local
     */
    public List consultarEstadoObra() {
        try {
            javax.persistence.Query q = em.createNamedQuery("EstadoObra.findAll");
            return q.getResultList();
        } catch (Exception e) {
            GestorEstadoObraBean.log4jArchivo(e);
            return null;
        }

    }

    /***
     * Retorna una lista con todas las instancias de EstadoObra.
     * @return una lista con todos los posibles estados de obras almacenados en la Base de Datos, y null en caso contrario
     * Interfaz remota
     */
    
    public List consultarEstadoObraRemote() {
        try {
            javax.persistence.Query q = em.createNamedQuery("EstadoObra.findAll");
            return q.getResultList();
        } catch (Exception e) {
            GestorEstadoObraBean.log4jArchivo(e);
            return null;
        }
    }

    /***
     * Retorna una lista con los nombres de todas las instancias de EstadoObra.
     * @return una lista con todos los nombres de los estados de obra ordenas y null en caso contrario
     * Interfaz local
     */
    public List estadosObra() {
        try{
            javax.persistence.Query q = em.createNamedQuery("EstadoObra.encontrarTodosPorNombre");
            return q.getResultList();

        } catch(Exception e){
            GestorEstadoObraBean.log4jArchivo(e);
            return null;
        }

    }

    /***
     * Retorna una lista con los nombres de todas las instancias de EstadoObra.
     * @return una lista con todos los nombres de los estados de obra ordenas y null en caso contrario
     * Interfaz remota
     */
    public List estadosObraRemote() {
        try{
            javax.persistence.Query q = em.createNamedQuery("EstadoObra.encontrarTodosPorNombre");
            return q.getResultList();

        } catch(Exception e){
            GestorEstadoObraBean.log4jArchivo(e);
            return null;
        }

    }

    /***
     * Retorna una instancia de tipo EstadoObra cuyo nombre coincida con el parametro nombre.
     * @param nombre
     * @return el estado de obra cuyo nombre es igual al pasado como parámetro y null en caso contrario
     * Interfaz local
     */

    public EstadoObra encontrarEstadoObra(String nombre){
        try{
            javax.persistence.Query q = em.createNamedQuery("EstadoObra.findByNombre");
            q.setParameter("nombre", nombre);
            return (EstadoObra)q.getSingleResult();

        } catch(Exception e){
            GestorEstadoObraBean.log4jArchivo(e);
            return null;
        }

    }

    /***
     * Retorna una instancia de tipo EstadoObra cuyo nombre coincida con el parametro nombre.
     * @param nombre
     * @return el estado de obra cuyo nombre es igual al pasado como parámetro, y null en caso contrario
     * Interfaz remota
     */
    public EstadoObra encontrarEstadoObraRemote(String nombre){
        try{
            javax.persistence.Query q = em.createNamedQuery("EstadoObra.findByNombre");
            q.setParameter("nombre", nombre);
            return (EstadoObra)q.getSingleResult();

        } catch(Exception e){
            GestorEstadoObraBean.log4jArchivo(e);
            return null;
        }

    }

    /***
     * Agrega una nueva instancia EstadoObra en la base de datos.
     * @param estadoObra
     * @return true en caso de que la nueva instancia de EstadoObra sea almacenada con éxito en la Base de Datos y
     * false en caso contrario
     * interfaz local
     */
     public boolean agregarEstadoObra(EstadoObra estadoObra) {
        try {
            persist(estadoObra);
            return true;
        } catch (Exception e) {
            GestorEstadoObraBean.log4jArchivo(e);
            return false;
        }
    }

     /***
      * Agrega una nueva instancia EstadoObra en la base de datos.
      * @param estadoObra
      * @return true en caso de que la nueva instancia de EstadoObra sea almacenada con éxito en la Base de Datos y
      * false en caso contrario
      * Interfaz remota
      */
    public boolean agregarEstadoObraRemote(EstadoObra estadoObra) {
        try {
            persist(estadoObra);
            return true;
        } catch (Exception e) {
            GestorEstadoObraBean.log4jArchivo(e);
            return false;
        }

    }

    /***
     * Busca y Actualiza una instancia de EstadoObra en la base de datos. Retorna True en
     * caso de exito y False en caso contrario.
     * @param estadoObra
     * @return true en caso de que el objeto estadoObra sea almacenado en la Base de Datos exitosamente
     * y false en caso contrario
     * Interfaz local
     */
    public boolean modificarEstadoObra(EstadoObra estadoObra) {
        try {
            EstadoObra tc = em.find(EstadoObra.class, estadoObra.getId());
            tc.setDescripcion(estadoObra.getDescripcion().toUpperCase());
            tc.setNombre(estadoObra.getNombre().toUpperCase());
            persist(tc);
            return true;
        } catch (Exception e) {
            GestorEstadoObraBean.log4jArchivo(e);
            return false;
        }
    }

    /***
     * Busca y Actualiza una instancia de EstadoObra en la base de datos. Retorna True en
     * caso de exito y False en caso contrario.
     * @param estadoObra
     * @return true en caso de que el objeto estadoObra sea almacenado en la Base de Datos exitosamente
     * y false en caso contrario
     * Interfaz remota
     */
    public boolean modificarEstadoObraRemote(EstadoObra estadoObra) {
        try {
            EstadoObra to = em.find(EstadoObra.class, estadoObra.getId());
            to.setDescripcion(estadoObra.getDescripcion().toUpperCase());
            to.setNombre(estadoObra.getNombre().toUpperCase());
            persist(to);
            return true;
        } catch (Exception e) {
            GestorEstadoObraBean.log4jArchivo(e);
            return false;
        }
    }

    /***
     * Busca y elimina una instancia de EstadoObra de la base de datos. Retorna True en
     * caso de exito y False en caso contrario.
     * @param estadoObra
     * @return true en caso de que el objeto estadoObra haya sido encontrado por su ID y eliminado físicamente
     * de la Base de Datos y false en caso contrario
     * Interfaz local
     */

    public boolean eliminarEstadoObra(EstadoObra estadoObra){
        try {
            EstadoObra to = em.find(EstadoObra.class, estadoObra.getId());
            em.remove(to);
            return true;
        } catch (Exception e) {
            GestorEstadoObraBean.log4jArchivo(e);
            return false;
        }
    }

    /***
     * Busca y elimina una instancia de EstadoObra de la base de datos. Retorna True en
     * caso de exito y False en caso contrario.
     * @param estadoObra
     * @return true en caso de que el objeto estadoObra haya sido encontrado por su ID y eliminado físicamente
     * de la Base de Datos y false en caso contrario
     * Interfaz remota
     */

    public boolean eliminarEstadoObraRemote(EstadoObra estadoObra){
        try {
            EstadoObra tc = em.find(EstadoObra.class, estadoObra.getId());
            em.remove(tc);
            return true;
        } catch (Exception e) {
            GestorEstadoObraBean.log4jArchivo(e);
            return false;
        }
    }

    /***
     * Valida si existe alguna instancia de EstadoObra con un nombre particular.
     * Retornando True en caso de que exista y False en caso contrario.
     * @param estadoObra
     * @return true si el objeto estadoObra se encuentra almacenado en la Base de datos con un nombre particular
     * y false en caso contrario
     * Interfaz local
     */
     public boolean existeNombreEstadoObra(EstadoObra estadoObra) {
        try {
            javax.persistence.Query q = em.createNamedQuery("EstadoObra.findByNombre");
            q.setParameter("nombre", estadoObra.getNombre().toUpperCase());
            if (q.getSingleResult() != null) {
                return true;
            } else {
                return false;
            }
        } catch (NoResultException ne) {
            GestorEstadoObraBean.log4jArchivo(ne);
            return false;
        } catch (NonUniqueResultException nue) {
            GestorEstadoObraBean.log4jArchivo(nue);
            return true;
        } catch (IllegalStateException ie) {
            GestorEstadoObraBean.log4jArchivo(ie);
            return true;
        }

    }

     /***
     * Valida si existe alguna instancia de EstadoObra con un nombre particular.
     * Retornando True en caso de que exista y False en caso contrario.
     * @param estadoObra
     * @return true si el objeto estadoObra se encuentra almacenado en la Base de datos con un nombre particular
     * y false en caso contrario
     * Interfaz remota
      */
    public boolean existeNombreEstadoObraRemote(EstadoObra estadoObra) {
        try {
            javax.persistence.Query q = em.createNamedQuery("EstadoObra.findByNombre");
            q.setParameter("nombre", estadoObra.getNombre().toUpperCase());
            if (q.getSingleResult() != null) {
                return true;
            } else {
                return false;
            }
        } catch (NoResultException ne) {
            GestorEstadoObraBean.log4jArchivo(ne);
            return false;
        } catch (NonUniqueResultException nue) {
            GestorEstadoObraBean.log4jArchivo(nue);
            return true;
        } catch (IllegalStateException ie) {
            GestorEstadoObraBean.log4jArchivo(ie);
            return true;
        }

    }

    /***
     * Valida si ya existe alguna instancia de EstadoObra en la base de datos con un nombre
     * igual al que se le quiere actualizar, retornando True en caso de exito y False en caso contario.
     * @param estadoObra
     * @return true en el caso de que exista algún objeto estadoObra almacenado en la BD 
     * que coincida con el nombre especificado y false en caso contrario
     * Intergaz local
     */
    public boolean existeNombreEstadoObraModificar(EstadoObra estadoObra) {
        try {
            javax.persistence.Query q = em.createNamedQuery("EstadoObra.findByNombreModificar");
            q.setParameter("nombre", estadoObra.getNombre().toUpperCase());
            q.setParameter("id", estadoObra.getId());
            if (q.getSingleResult() != null) {
                return true;
            } else {
                return false;
            }
        } catch (NoResultException ne) {
            GestorEstadoObraBean.log4jArchivo(ne);
            return false;
        } catch (NonUniqueResultException nue) {
            GestorEstadoObraBean.log4jArchivo(nue);
            return true;
        } catch (IllegalStateException ie) {
            GestorEstadoObraBean.log4jArchivo(ie);
            return true;
        }
    }

    /***
     * Valida si ya existe alguna instancia de EstadoObra en la base de datos con un nombre
     * igual al que se le quiere actualizar, retornando True en caso de exito y False en caso contario.
     * @param estadoObra
     * @return true en el caso de que exista algún objeto estadoObra almacenado en la BD que coincida con el nombre especificado
     * y false en caso contrario
     * Interfaz remota
     */
    public boolean existeNombreEstadoObraModificarRemote(EstadoObra estadoObra) {
        try {
            javax.persistence.Query q = em.createNamedQuery("EstadoObra.findByNombreModificar");
            q.setParameter("nombre", estadoObra.getNombre().toUpperCase());
            q.setParameter("id", estadoObra.getId());
            if (q.getSingleResult() != null) {
                return true;
            } else {
                return false;
            }
        } catch (NoResultException ne) {
            GestorEstadoObraBean.log4jArchivo(ne);
            return false;
        } catch (NonUniqueResultException nue) {
            GestorEstadoObraBean.log4jArchivo(nue);
            return true;
        } catch (IllegalStateException ie) {
            GestorEstadoObraBean.log4jArchivo(ie);
            return true;
        }
    }


    /***
     * Valida si existe alguna instancia de EstadoObra con id igual al parametro idEstadoObra
     * asignado a alguna instancia de Obra.
     * @param idEstadoObra
     * @return true en caso de que exista un estado de obra con ID igual a idEstadoObra asignado a alguna obra
     * y false en caso contrario
     * Interfaz local
     */
    public boolean estadoObraFueAsignadoObras(int idEstadoObra) {
        try {
            javax.persistence.Query q = em.createNamedQuery("Obra.estadoObraTieneObras");
            q.setParameter("idEstado", idEstadoObra);
            if (q.getResultList() != null) {
                if (q.getResultList().size() > 0) {
                    return true;
                } else {
                    return false;
                }
            } else {
                return false;
            }

        } catch (Exception e) {
            GestorEstadoObraBean.log4jArchivo(e);
            return false;
        }
    }

    /***
     * Valida si existe alguna instancia de EstadoObra con id igual al parametro idEstadoObra
     * asignado a alguna instancia de Obra.
     * @param idEstadoObra
     * @return true en caso de que exista un estado de obra con ID igual a idEstadoObra asignado a alguna obra
     * y false en caso contrario
     * Interfaz remota
     */
    public boolean estadoObraFueAsignadoObrasRemote(int idEstadoObra) {
        try {
            javax.persistence.Query q = em.createNamedQuery("Obra.estadoObraTieneObras");
            q.setParameter("idEstado", idEstadoObra);
            if (q.getResultList() != null) {
                if (q.getResultList().size() > 0) {
                    return true;
                } else {
                    return false;
                }
            } else {
                return false;
            }

        } catch (Exception e) {
            GestorEstadoObraBean.log4jArchivo(e);
            return false;
        }
    }
   
}

